From: awilliam@xenbuild2.aw Date: Fri, 12 Jan 2007 19:11:11 +0000 (-0700) Subject: [IA64] Simplify lazy cover algorithm X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~15410 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=ee74bcacd57f431e72d1726909bc2206382536ec;p=xen.git [IA64] Simplify lazy cover algorithm Signed-off-by: Anthony Xu --- diff --git a/linux-2.6-xen-sparse/arch/ia64/kernel/asm-offsets.c b/linux-2.6-xen-sparse/arch/ia64/kernel/asm-offsets.c index 7bee9111c6..604ad3b8f2 100644 --- a/linux-2.6-xen-sparse/arch/ia64/kernel/asm-offsets.c +++ b/linux-2.6-xen-sparse/arch/ia64/kernel/asm-offsets.c @@ -280,7 +280,6 @@ void foo(void) DEFINE_MAPPED_REG_OFS(XSI_IHA_OFS, iha); DEFINE_MAPPED_REG_OFS(XSI_ITIR_OFS, itir); DEFINE_MAPPED_REG_OFS(XSI_PSR_IC_OFS, interrupt_collection_enabled); - DEFINE_MAPPED_REG_OFS(XSI_INCOMPL_REGFR_OFS, incomplete_regframe); DEFINE_MAPPED_REG_OFS(XSI_BANKNUM_OFS, banknum); DEFINE_MAPPED_REG_OFS(XSI_BANK0_R16_OFS, bank0_regs[0]); DEFINE_MAPPED_REG_OFS(XSI_BANK1_R16_OFS, bank1_regs[0]); diff --git a/linux-2.6-xen-sparse/arch/ia64/xen/xenminstate.h b/linux-2.6-xen-sparse/arch/ia64/xen/xenminstate.h index b3902a6a80..75ec49f886 100644 --- a/linux-2.6-xen-sparse/arch/ia64/xen/xenminstate.h +++ b/linux-2.6-xen-sparse/arch/ia64/xen/xenminstate.h @@ -151,16 +151,7 @@ .mem.offset 8,0; st8.spill [r17]=r11,24; \ ;; \ /* xen special handling for possibly lazy cover */ \ - movl r8=XSI_INCOMPL_REGFR; \ - ;; \ - ld4 r30=[r8]; \ - ;; \ - /* set XSI_INCOMPL_REGFR 0 */ \ - st4 [r8]=r0; \ - cmp.eq p6,p7=r30,r0; \ - ;; /* not sure if this stop bit is necessary */ \ -(p6) adds r8=XSI_PRECOVER_IFS-XSI_INCOMPL_REGFR,r8; \ -(p7) adds r8=XSI_IFS-XSI_INCOMPL_REGFR,r8; \ + movl r8=XSI_PRECOVER_IFS; \ ;; \ ld8 r30=[r8]; \ ;; \ diff --git a/linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h b/linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h index a0c2828b63..4270894a1e 100644 --- a/linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h +++ b/linux-2.6-xen-sparse/include/asm-ia64/xen/privop.h @@ -49,7 +49,6 @@ #define XSI_IFS (XSI_BASE + XSI_IFS_OFS) #define XSI_PRECOVER_IFS (XSI_BASE + XSI_PRECOVER_IFS_OFS) -#define XSI_INCOMPL_REGFR (XSI_BASE + XSI_INCOMPL_REGFR_OFS) #define XSI_IFA (XSI_BASE + XSI_IFA_OFS) #define XSI_ISR (XSI_BASE + XSI_ISR_OFS) #define XSI_IIM (XSI_BASE + XSI_IIM_OFS) diff --git a/xen/arch/ia64/asm-xsi-offsets.c b/xen/arch/ia64/asm-xsi-offsets.c index c4bfdf2a3c..f9d22358f2 100755 --- a/xen/arch/ia64/asm-xsi-offsets.c +++ b/xen/arch/ia64/asm-xsi-offsets.c @@ -62,7 +62,6 @@ void foo(void) DEFINE_MAPPED_REG_OFS(XSI_ITV_OFS, itv); DEFINE_MAPPED_REG_OFS(XSI_PTA_OFS, pta); DEFINE_MAPPED_REG_OFS(XSI_PSR_IC_OFS, interrupt_collection_enabled); - DEFINE_MAPPED_REG_OFS(XSI_INCOMPL_REGFR_OFS, incomplete_regframe); DEFINE_MAPPED_REG_OFS(XSI_METAPHYS_OFS, metaphysical_mode); DEFINE_MAPPED_REG_OFS(XSI_BANKNUM_OFS, banknum); DEFINE_MAPPED_REG_OFS(XSI_BANK0_R16_OFS, bank0_regs[0]); diff --git a/xen/arch/ia64/xen/faults.c b/xen/arch/ia64/xen/faults.c index 7cf641b6fe..53a2545b22 100644 --- a/xen/arch/ia64/xen/faults.c +++ b/xen/arch/ia64/xen/faults.c @@ -88,7 +88,6 @@ void reflect_interruption(unsigned long isr, struct pt_regs *regs, PSCB(v, isr) = isr; PSCB(v, iip) = regs->cr_iip; PSCB(v, ifs) = 0; - PSCB(v, incomplete_regframe) = 0; regs->cr_iip = ((unsigned long)PSCBX(v, iva) + vector) & ~0xffUL; regs->cr_ipsr = (regs->cr_ipsr & ~DELIVER_PSR_CLR) | DELIVER_PSR_SET; @@ -155,7 +154,6 @@ void reflect_event(void) PSCB(v, isr) = isr; PSCB(v, iip) = regs->cr_iip; PSCB(v, ifs) = 0; - PSCB(v, incomplete_regframe) = 0; regs->cr_iip = v->arch.event_callback_ip; regs->cr_ipsr = (regs->cr_ipsr & ~DELIVER_PSR_CLR) | DELIVER_PSR_SET; @@ -185,7 +183,6 @@ static int handle_lazy_cover(struct vcpu *v, struct pt_regs *regs) { if (!PSCB(v, interrupt_collection_enabled)) { PSCB(v, ifs) = regs->cr_ifs; - PSCB(v, incomplete_regframe) = 1; regs->cr_ifs = 0; perfc_incrc(lazy_cover); return 1; // retry same instruction with cr.ifs off diff --git a/xen/arch/ia64/xen/hyperprivop.S b/xen/arch/ia64/xen/hyperprivop.S index 9d6d418784..ca86b0432a 100644 --- a/xen/arch/ia64/xen/hyperprivop.S +++ b/xen/arch/ia64/xen/hyperprivop.S @@ -192,7 +192,6 @@ END(fast_hyperprivop) // and isr.ri to cr.isr.ri (all other bits zero) // - cover and set shared_mem precover_ifs to cr.ifs // ^^^ MISSED THIS FOR fast_break?? -// - set shared_mem ifs and incomplete_regframe to 0 // - set shared_mem interrupt_delivery_enabled to 0 // - set shared_mem interrupt_collection_enabled to 0 // - set r31 to SHAREDINFO_ADDR @@ -272,11 +271,9 @@ ENTRY(hyper_ssm_i) st1 [r22]=r20 st4 [r18]=r0 // cover and set shared_mem precover_ifs to cr.ifs - // set shared_mem ifs and incomplete_regframe to 0 + // set shared_mem ifs to 0 cover ;; mov r20=cr.ifs;; - adds r21=XSI_INCOMPL_REGFR_OFS-XSI_PSR_IC_OFS,r18 ;; - st4 [r21]=r0 ;; adds r21=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18 ;; st8 [r21]=r0 ;; adds r21=XSI_PRECOVER_IFS_OFS-XSI_PSR_IC_OFS,r18 ;; @@ -459,11 +456,9 @@ GLOBAL_ENTRY(fast_tick_reflect) st1 [r22]=r20;; st4 [r18]=r0;; // cover and set shared_mem precover_ifs to cr.ifs - // set shared_mem ifs and incomplete_regframe to 0 + // set shared_mem ifs to 0 cover ;; mov r20=cr.ifs;; - adds r21=XSI_INCOMPL_REGFR_OFS-XSI_PSR_IC_OFS,r18 ;; - st4 [r21]=r0 ;; adds r21=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18 ;; st8 [r21]=r0 ;; adds r21=XSI_PRECOVER_IFS_OFS-XSI_PSR_IC_OFS,r18 ;; @@ -645,11 +640,9 @@ ENTRY(fast_reflect) st1 [r24]=r22 st4 [r18]=r0;; // cover and set shared_mem precover_ifs to cr.ifs - // set shared_mem ifs and incomplete_regframe to 0 + // set shared_mem ifs to 0 cover ;; mov r24=cr.ifs;; - adds r21=XSI_INCOMPL_REGFR_OFS-XSI_PSR_IC_OFS,r18 ;; - st4 [r21]=r0 ;; adds r21=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18 ;; st8 [r21]=r0 ;; adds r21=XSI_PRECOVER_IFS_OFS-XSI_PSR_IC_OFS,r18 ;; @@ -1082,8 +1075,6 @@ ENTRY(hyper_rfi) just_do_rfi: // r18=&vpsr.i|vpsr.ic, r21==vpsr, r22=vcr.iip mov cr.iip=r22;; - adds r20=XSI_INCOMPL_REGFR_OFS-XSI_PSR_IC_OFS,r18 ;; - st4 [r20]=r0 ;; adds r20=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18 ;; ld8 r20=[r20];; dep r20=0,r20,38,25;; // ensure ifs has no reserved bits set @@ -1259,20 +1250,16 @@ ENTRY(rfi_with_interrupt) st1 [r22]=r20 st4 [r18]=r0;; // cover and set shared_mem precover_ifs to cr.ifs - // set shared_mem ifs and incomplete_regframe to 0 + // set shared_mem ifs to 0 #if 0 cover ;; mov r20=cr.ifs;; - adds r22=XSI_INCOMPL_REG_OFS-XSI_PSR_IC_OFS,r18 ;; - st4 [r22]=r0 ;; adds r22=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18 ;; st8 [r22]=r0 ;; adds r22=XSI_PRECOVER_IFS_OFS-XSI_PSR_IC_OFS,r18 ;; st8 [r22]=r20 ;; // leave cr.ifs alone for later rfi #else - adds r22=XSI_INCOMPL_REG_OFS-XSI_PSR_IC_OFS,r18 ;; - st4 [r22]=r0 ;; adds r22=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18 ;; ld8 r20=[r22];; st8 [r22]=r0 ;; @@ -1334,13 +1321,9 @@ ENTRY(hyper_cover) mov r25=cr.iip;; // skip test for vpsr.ic.. it's a prerequisite for hyperprivops cover ;; - adds r20=XSI_INCOMPL_REGFR_OFS-XSI_PSR_IC_OFS,r18 ;; - mov r30=cr.ifs;; - adds r22=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18 - ld4 r21=[r20] ;; - cmp.eq p6,p7=r21,r0 ;; -(p6) st8 [r22]=r30;; -(p7) st4 [r20]=r0;; + mov r30=cr.ifs + adds r22=XSI_IFS_OFS-XSI_PSR_IC_OFS,r18;; + st8 [r22]=r30;; mov cr.ifs=r0;; // adjust return address to skip over break instruction extr.u r26=r24,41,2 ;; diff --git a/xen/arch/ia64/xen/vcpu.c b/xen/arch/ia64/xen/vcpu.c index 0eceeb38ae..dff7259d43 100644 --- a/xen/arch/ia64/xen/vcpu.c +++ b/xen/arch/ia64/xen/vcpu.c @@ -613,7 +613,6 @@ IA64FAULT vcpu_get_ifs(VCPU * vcpu, u64 * pval) //PSCB(vcpu,ifs) = PSCB(vcpu)->regs.cr_ifs; //*pval = PSCB(vcpu,regs).cr_ifs; *pval = PSCB(vcpu, ifs); - PSCB(vcpu, incomplete_regframe) = 0; return IA64_NO_FAULT; } @@ -1362,7 +1361,6 @@ IA64FAULT vcpu_rfi(VCPU * vcpu) printk("*** DOMAIN TRYING TO TURN ON BIG-ENDIAN!!!\n"); return IA64_ILLOP_FAULT; } - PSCB(vcpu, incomplete_regframe) = 0; // is this necessary? ifs = PSCB(vcpu, ifs); if (ifs > 0x8000000000000000UL) { @@ -1397,10 +1395,7 @@ IA64FAULT vcpu_cover(VCPU * vcpu) REGS *regs = vcpu_regs(vcpu); if (!PSCB(vcpu, interrupt_collection_enabled)) { - if (!PSCB(vcpu, incomplete_regframe)) - PSCB(vcpu, ifs) = regs->cr_ifs; - else - PSCB(vcpu, incomplete_regframe) = 0; + PSCB(vcpu, ifs) = regs->cr_ifs; } regs->cr_ifs = 0; return IA64_NO_FAULT; diff --git a/xen/include/public/arch-ia64.h b/xen/include/public/arch-ia64.h index 7425cafd94..ac8292d2a0 100644 --- a/xen/include/public/arch-ia64.h +++ b/xen/include/public/arch-ia64.h @@ -287,10 +287,9 @@ struct mapped_regs { */ unsigned char *interrupt_mask_addr; int pending_interruption; - int incomplete_regframe; // see SDM vol2 6.8 unsigned char vpsr_pp; - unsigned char reserved5_2[7]; - unsigned long reserved5_1[3]; + unsigned char reserved5_2[3]; + unsigned long reserved5_1[4]; int metaphysical_mode; // 1 = use metaphys mapping, 0 = use virtual int banknum; // 0 or 1, which virtual register bank is active unsigned long rrs[8]; // region registers